//============================================================================
// Name        : CapaN-Distribuidos.cpp
// Author      : 
// Version     :
// Copyright   : 
//============================================================================

#include <iostream>
#include <cstring>
#include "../IPC/SizedMessageQueue.h"
#include "../middleware/MiddlewareCommon.h"
#include "../CapaComunicacion/APICapaComunicacion.h"
#include "../CapaServiciosDistribuidos/Protocolo.h"
#include "../common/ArchivoIni.h"
#include "../common/Argv.h"
#include "../logger/logger.h"
#include "../IPC/MessageQueue.h"
#include "../common/IPCUids.h"
#include "../common/ArchivoCSV.h"

using namespace std;

/*
 *  Componente de capa N : Receptor de Mensajes de MQueue
 *
 *	- Lee de la cola de servicios capa N
 *	- Saca un nuevo mensaje M
 *	- Descarta los headers de la capa de servicios distribuidos, se queda con:
 *		- Size = sizeof(t_mensaje)
 *		- Id cola destino = Id de la que estoy leyendo
 *		- Mtype = mtype
 *		- Mensaje = M
 *
 *	- Envia a la cola Id cola destino el mensaje M con mtype mtype.
 */
int main(int argc, char* argv[]) {
	Argv args(argv);
	CLogger::create("Emisor mensajes", true);

	if (args.getArgc() != 1) {
		cout << "Uso: ./receptor" << endl;
		CLogger::log("Parámetros incorrectos", LogLevelEnum::FATAL);
		exit(1);
	}

	CLogger::log("Esperando mensaje de MessageQueue para la aplicación.", LogLevelEnum::INFO);

	bool conexionTerminada = false;
	while(!conexionTerminada) {
		PDUServicioMensajes pduMensajes;
		PayloadCapaServicios payloadServicios;
		ipc::MessageQueue<PayloadCapaServicios> colaEspera;
		payloadServicios = colaEspera.get(MTYPE_CAPAN_MENSAJES);
		memcpy((void*)& pduMensajes, (const void*) &payloadServicios, TAM_PAYLOAD_CAPAN);

		int uidColaDestino = pduMensajes.UidColaDestino;
		int mtype = pduMensajes.payloadMq.mtype;
		int size = pduMensajes.payloadMq.size;

		/* Debug: imprimimos parametros */
		CLogger::log("Id de cola destino" +StringUtils::itos(uidColaDestino));
		CLogger::log("Mtype " + StringUtils::itos(mtype));
		CLogger::log("Size del mensaje " + StringUtils::itos(size));

		/* Datos obtenidos por uidColaDestino */
		std::string file = IPCUids::getFile(uidColaDestino, false);
		int charKey = IPCUids::getKey(uidColaDestino);

		if (IPCUids::error()) {
			CLogger::log("Error al obtener datos del uid, chequee que exista el uid "+ StringUtils::itos(uidColaDestino)+" por favor.", LogLevelEnum::FATAL);
			continue;
		}

		ipc::SizedMessageQueue sizedMQueue = ipc::SizedMessageQueue::get(file, charKey);
		sizedMQueue.put(mtype, (void*) pduMensajes.payloadMq.data, size);
	}

	return 0;
}
